]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
components: Change component loading to be asynchronous
authorEvan Welsh <contact@evanwelsh.com>
Mon, 10 Jul 2023 09:34:17 +0000 (02:34 -0700)
committerFlorian Müllner <fmuellner@gnome.org>
Sat, 5 Aug 2023 20:16:23 +0000 (22:16 +0200)
Some components use build time optional dependencies such as
GNOME Bluetooth, so we need to import the components
conditionally.

Also rename to get rid of __init__.js file

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1499>

js/js-resources.gresource.xml
js/ui/components.js [new file with mode: 0644]
js/ui/components/__init__.js [deleted file]

index e223ee1280af9aac54fc35cbd1ebd11032d2cd88..ee4b7635e96f5576b77314470ef90071d07abe84 100644 (file)
     <file>ui/workspacesView.js</file>
     <file>ui/xdndHandler.js</file>
 
-    <file>ui/components/__init__.js</file>
+    <file>ui/components.js</file>
     <file>ui/components/autorunManager.js</file>
     <file>ui/components/automountManager.js</file>
     <file>ui/components/networkAgent.js</file>
diff --git a/js/ui/components.js b/js/ui/components.js
new file mode 100644 (file)
index 0000000..06751a9
--- /dev/null
@@ -0,0 +1,62 @@
+/* exported ComponentManager */
+const Main = imports.ui.main;
+
+var ComponentManager = class {
+    constructor() {
+        this._allComponents = {};
+        this._enabledComponents = [];
+
+        Main.sessionMode.connect('updated', () => {
+            this._sessionModeUpdated().catch(logError);
+        });
+
+        this._sessionModeUpdated().catch(logError);
+    }
+
+    async _sessionModeUpdated() {
+        let newEnabledComponents = Main.sessionMode.components;
+
+        await Promise.allSettled([...newEnabledComponents
+            .filter(name => !this._enabledComponents.includes(name))
+            .map(name => this._enableComponent(name))]);
+
+        this._enabledComponents
+            .filter(name => !newEnabledComponents.includes(name))
+            .forEach(name => this._disableComponent(name));
+
+        this._enabledComponents = newEnabledComponents;
+    }
+
+    async _importComponent(name) {
+        // TODO: Import as module
+        let module = await imports.ui.components[name];
+        return module.Component;
+    }
+
+    async _ensureComponent(name) {
+        let component = this._allComponents[name];
+        if (component)
+            return component;
+
+        if (Main.sessionMode.isLocked)
+            return null;
+
+        let constructor = await this._importComponent(name);
+        component = new constructor();
+        this._allComponents[name] = component;
+        return component;
+    }
+
+    async _enableComponent(name) {
+        let component = await this._ensureComponent(name);
+        if (component)
+            component.enable();
+    }
+
+    _disableComponent(name) {
+        let component = this._allComponents[name];
+        if (component == null)
+            return;
+        component.disable();
+    }
+};
diff --git a/js/ui/components/__init__.js b/js/ui/components/__init__.js
deleted file mode 100644 (file)
index 7430013..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/* exported ComponentManager */
-const Main = imports.ui.main;
-
-var ComponentManager = class {
-    constructor() {
-        this._allComponents = {};
-        this._enabledComponents = [];
-
-        Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
-        this._sessionUpdated();
-    }
-
-    _sessionUpdated() {
-        let newEnabledComponents = Main.sessionMode.components;
-
-        newEnabledComponents
-            .filter(name => !this._enabledComponents.includes(name))
-            .forEach(name => this._enableComponent(name));
-
-        this._enabledComponents
-            .filter(name => !newEnabledComponents.includes(name))
-            .forEach(name => this._disableComponent(name));
-
-        this._enabledComponents = newEnabledComponents;
-    }
-
-    _importComponent(name) {
-        let module = imports.ui.components[name];
-        return module.Component;
-    }
-
-    _ensureComponent(name) {
-        let component = this._allComponents[name];
-        if (component)
-            return component;
-
-        if (Main.sessionMode.isLocked)
-            return null;
-
-        let constructor = this._importComponent(name);
-        component = new constructor();
-        this._allComponents[name] = component;
-        return component;
-    }
-
-    _enableComponent(name) {
-        let component = this._ensureComponent(name);
-        if (component)
-            component.enable();
-    }
-
-    _disableComponent(name) {
-        let component = this._allComponents[name];
-        if (component == null)
-            return;
-        component.disable();
-    }
-};